package dao

import (
	"fmt"
	"go_cms/app/model"
	"go_cms/app/param"
	"go_cms/utils"
	"strings"
)

type UserDao struct {
	*utils.Db
}


const debug = true
// 根据用户名和密码查询数据库中是否存在
func (this *UserDao) Query(name, passwd string) *model.TokenUser{
	//var user model.User
	var tokenUser model.TokenUser
	//sqlStr := `select id,name from user where name=? and passwd=?`
	//this.Select("id,name").Where("name = ? AND passwd = ?",name,passwd).First(&user)
	//this.Table("user").Select("id","name").Where("name = ? AND passwd = ?",name,passwd).Find(&user)
	this.Table("users").Select("id","name").Where("name = ? AND passwd = ?",name,passwd).Find(&tokenUser)

	if debug {
		fmt.Printf("userDao.go 26:%#v\n",tokenUser)
	}

	return &tokenUser
}

// /users/:uid 该接口返回用户详细信息
func (this *UserDao) QueryUsersById(id string) *param.UsersInfo {
	var users param.Users
	this.Table("users").Where("id = ?",id).Find(&users)
	if debug {
		fmt.Printf("userDao.go 38:%#v\n",users)
	}
	if users.ID!=0{
		// 能查到用户 然后需要查询部门和角色
		var role param.Role
		this.Table("roles").Select("id,created_at,updated_at,intro,name").Where("id = ? ",users.Role).Find(&role)
		if debug {
			fmt.Printf("userDao.go 38:%#v\n",role)
		}
		var department param.Department
		this.Table("departments").Where("id = ? ",users.Department).Find(&department)
		if debug {
			fmt.Printf("userDao.go 38:%#v\n",department)
		}
		// 将查询的信息合并到users info结构体中
		var userinfo param.UsersInfo
		userinfo.ID=users.ID
		userinfo.CreatedAt=users.CreatedAt
		userinfo.UpdatedAt=users.UpdatedAt
		userinfo.Name=users.Name
		userinfo.Realname=users.Realname
		userinfo.Enable=users.Enable
		userinfo.Cellphone=users.Cellphone
		userinfo.Role=role
		userinfo.Department=department

		return &userinfo
	}
	return nil
}

// 根据id删除用户
func (this *UserDao) DeleteUserById(id string) {
	this.Delete(&model.User{}, id)
}

// 获取角色权限 /role/uid/menu
func (this *UserDao)RoleMenu(id string) []*param.Menu{
	var role param.Role
	this.Table("roles").Select("menu_list").Where("id = ?",id).Find(&role)
	if role.MenuList != ""{
		//// 先查出所有菜单
		//var menus []*param.Menu
		//this.Table("menus").Find(&menus)
		//fmt.Printf("userDao.go 80:%#v\n",menus[0])

		menu_list := strings.Split(role.MenuList,",")
		//// 改方法查询数据库次数过多，影响性能
		//var res_menu []*param.Menu
		//var class1_menus []*param.Menu
		//var class2_menus []*param.Menu
		//var class3_menus []*param.Menu
		//for _,v := range menu_list{
		//	//// 该方式查询数据库比较慢，是否还有其他方法？ 待优化！！！。。。
		//	var menu param.Menu	// 每循环一遍就查询一遍数据库，太耗费性能
		//	this.Table("menus").Where("id = ?",v).Find(&menu)
		//	//fmt.Printf("userDao.go 85:%#v\n",menu)
		//	if menu.Type==1{
		//		class1_menus=append(class1_menus,&menu)
		//	}else if menu.Type==2{
		//		class2_menus=append(class2_menus,&menu)
		//	}else if menu.Type==3{
		//		class3_menus=append(class3_menus,&menu)
		//	}
		//}
		//for i2,_:=range class2_menus{
		//	for i3,_:=range class3_menus{
		//		if class3_menus[i3].ParentId==class2_menus[i2].ID{
		//			class2_menus[i2].Child=append(class2_menus[i2].Child,class3_menus[i3])
		//		}
		//	}
		//}
		//for i1,_:=range class1_menus{
		//	for i2,_:=range class2_menus{
		//		if class2_menus[i2].ParentId==class1_menus[i1].ID{
		//			class1_menus[i1].Child=append(class1_menus[i1].Child,class2_menus[i2])
		//		}
		//	}
		//	res_menu=append(res_menu,class1_menus[i1])
		//}
		var menu []*param.Menu
		this.Table("menus").Where("id IN ?",menu_list).Find(&menu)

		return utils.MakeMenuTree(menu)
	}
	return nil
}


